package main

import "fmt"

func factorial_v1(n int) int {
	num := 1
	if n == 0 || n == 1 {
		return num
	} else {
		for i := 1; i <= n; i++ {
			num *= i
		}
		return num
	}
}

func factorial_v2(n int) int {
	if n == 0 || n == 1 {
		return 1
	}
	return n * factorial_v2(n-1)

}

func factorial_v3(n, b int) int {
	if n == 0 || n == 1 {
		return b
	}
	return factorial_v3(n-1, n*b)
}

//编写一个函数，接受一个参数n，n为正整数。要求数字必须对齐
//                         1
//                       2 1
//                     3 2 1
//                   4 3 2 1
//                 5 4 3 2 1
//               6 5 4 3 2 1
//             7 6 5 4 3 2 1
//           8 7 6 5 4 3 2 1
//         9 8 7 6 5 4 3 2 1
//      10 9 8 7 6 5 4 3 2 1
//   11 10 9 8 7 6 5 4 3 2 1
//12 11 10 9 8 7 6 5 4 3 2 1

func ssj(n int) {
	for i := 1; i <= n; i++ {
		for k := 1; k <= n-i; k++ {
			if n-k > 8 {
				fmt.Printf("   ")
			} else {
				fmt.Printf("  ")
			}
		}
		for j := i; j > 0; j-- {
			fmt.Printf("%d ", j)
		}
		fmt.Println()
	}
}

func main() {
	// n := 5
	// var num = 1
	// for i := 1; i <= n; i++ {
	// 	num *= i
	// }
	// fmt.Println(num)

	num1 := factorial_v1(5)
	fmt.Println(num1)

	num2 := factorial_v2(5)
	fmt.Println(num2)

	num3 := factorial_v3(6, 1)
	fmt.Println(num3)

	ssj(12)

}


// 批改意见
// 阶乘和输出三角的函数中都需要考虑n<0时的特殊情况